package main
import (
	"fmt"
)
//环形链表~

func main(){
	head := &CatNode{} //创建头结点

	//创建猫
	cat1 := &CatNode{
		no : 1,
		name : "tom",
	}
	cat2 := &CatNode{
		no : 2,
		name : "mini",
	}
	cat3 := &CatNode{
		no : 3,
		name : "ak",
	}
	InsertCatNode(head,cat1)
	InsertCatNode(head,cat2)
	InsertCatNode(head,cat3)
	ListCircleLink(head)

	head = DelCatNode(head,4)
	head = DelCatNode(head,2)
	ListCircleLink(head)
}

type CatNode struct{
	no int
	name string
	next *CatNode
}
//插入一只猫
func InsertCatNode(head *CatNode,newCatNode *CatNode){
	//判断是不是第一只猫~是就赋值给头结点
	if head.next == nil{
		head.no = newCatNode.no
		head.name = newCatNode.name
		head.next = head //形成只有一个元素的环~！
		fmt.Println("已加入第一只猫进入环形列表")
		return 
	}
	temp := head
	for {
		if temp.next == head{
			break
		}
		temp = temp.next
	}
	temp.next = newCatNode
	newCatNode.next = head
}
//遍历所有猫
func ListCircleLink(head *CatNode){
	temp := head
	if temp.next == nil{
		fmt.Println("链表为空")
		return
	}
	for {
		fmt.Printf("猫猫%s->",temp.name)
		if temp.next == head{
			break
		}
		temp = temp.next
	}
}

//删除一只猫
func DelCatNode(head *CatNode,no int)*CatNode{  
	//之所以要返回值，是因为防止删除就是头结点时，main函数的头结点还傻傻的指着被删结点
	temp := head
	helper := head
	if temp.next == nil {
		fmt.Println("这是一个空链表~")
		return head
	}
	//如果只有一个猫结点
	if temp.next == head {
		if temp.no == no{
			temp.next = nil  //就直接将该结点的next置空
		}
		return head
	}

	//将helper定位到链表最后
	for {
		if helper.next == head{
			break
		}
		helper = helper.next
	}

	//如果有两个以上的结点
	flag := true
	for {
		if temp.no ==no {
			if temp == head { //说明删除的是头结点
				head = head.next
			}
			//恭喜找到., 我们也可以在直接删除
			helper.next = temp.next
			fmt.Printf("删除了猫猫=%s\n", temp.name)
			flag = false
			break
		}
		if temp.next == head { //如果到这来，说明我比较到最后一个
			break 
		} 
		temp = temp.next //移动 【比较】
		helper = helper.next //移动 【一旦找到要删除的结点 helper】
	}
	if flag {
		fmt.Println("\n没有找到你要删除的猫猫~\n")
	}
	return head
}